import {clearToken, getToken} from '@/utils/auth';
import global from '@/global';
import {pages} from '@/utils/page-url';

const uvRequest = (): void => {

    // @ts-ignore
    uni.$uv.http.setConfig((config: any) => {
        /* config 为默认全局配置*/
        // 根域名
        config.baseURL = global.baseUrl;
        config.custom = {auth: true};
        return config;
    });

    // 请求拦截器
    // @ts-ignore
    uni.$uv.http.interceptors.request.use((config: any) => {
        // 可使用async await 做异步操作
        config.header = {
            ...config.header,
            a: 1 // 演示拦截器header加参
        }
        // 是否需要携带token
        if (config.custom.auth) {
            const token = getToken();
            // 如果token不存在，return Promise.reject(config) 会取消本次请求
            if (!token) {
                // @ts-ignore
                uni.$uv.route({
                    type: 'to',
                    url: pages.login
                });
                return Promise.reject("未登录");
            }
            config.header['Authorization'] = 'Bearer ' + getToken()
        }
        return config;
    }, (config: any) => {
        // 可使用async await 做异步操作
        return Promise.reject(config);
    });

    // 响应拦截器
    // @ts-ignore
    uni.$uv.http.interceptors.response.use((response: any) => {
        /* 对响应成功做点什么 可使用async await 做异步操作*/
        // if (response.data.code !== 200) { // 服务端返回的状态码不等于200，则reject()
        //    	return Promise.reject(response) // return Promise.reject 可使promise状态进入catch
        // if (response.config.custom.verification) { // 演示自定义参数的作用
        //   	return response.data
        // }
        if ("DOWNLOAD" === response.config.method) {
            return response;
        }
        const data = response.data;
        if (data.code === 50001) {
            // 未登录
            if (global.loginAuth) {
                clearToken();
                // @ts-ignore
                uni.$uv.route({
                    type: 'launch',
                    url: pages.login
                });
            } else {
                // @ts-ignore
                uni.$uv.route({
                    type: 'to',
                    url: pages.login
                });
            }
            return Promise.reject('50001未登录');
        }
        if (data.code !== 200) {
            // 请求成功，但有提示
            uni.showToast({
                title: data.msg,
                icon: "none",
                duration: 1500
            })
        }
        return response.data;
    }, (response: any) => {
        /*  对响应错误做点什么 （statusCode !== 200）*/
        console.log(response);
        const statusCode = response.statusCode;
        if (statusCode === 401) {
            // 未登录
            if (global.loginAuth) {
                // @ts-ignore
                uni.$uv.route({
                    type: 'launch',
                    url: pages.login
                });
            } else {
                // @ts-ignore
                uni.$uv.route({
                    type: 'to',
                    url: pages.login
                });
            }
        } else if (statusCode === 404) {
            // 页面不存在
            uni.showToast({
                title: '页面不存在',
                icon: "none",
                duration: 1500
            })
        } else if (statusCode === 500) {
            // 服务器异常
            uni.showToast({
                title: '请求异常，请联系管理员',
                icon: "none",
                duration: 1500
            })
        } else {
            // 其他错误
            uni.showToast({
                title: response.errMsg,
                icon: "none",
                duration: 1500
            })
            if (getToken() && !global.loginAuth) {
                clearToken()
            }
        }

        return Promise.reject('请求异常');
    });
}


export default uvRequest();
